//
//  StatusDAL.swift
//  新浪微博01
//
//  Created by 李国伟 on 15/12/22.
//  Copyright © 2015年 李国伟. All rights reserved.
//

import Foundation

//最大缓存时间为7天
let MaxCacheDate: NSTimeInterval = 60 * 60 * 24 * 7

//MARK: 这是一个数据库管理类
class StatusDAL {
    
    //MARK: 检测数据是否过期
    /**
    1. 清理缓存工作，千万不要交给用户使用！
    2. 一定要定期清理数据库的缓存，原因
    - SQLite 的数据库，随着数据的增加，会不断的变大
    - 但是：如果删除了数据，数据库不会变小！SQLite 认为，既然数据库会涨到这么大，留出空间，准备下一次涨到这么大
    - SQLite不会再额外分配磁盘空间
    - 一般不会把 图片/音频/视频 放在数据库中，不便于检索，占用磁盘空间很大！
    */
    /// 清理`早于过期日期`的缓存数据
    class func clearMaxDate (){
        
        //获取当前时间并减去最大存储时间
        let date = NSDate(timeIntervalSinceNow: -MaxCacheDate)
        
        //获取日期格式
        let formart = NSDateFormatter()
        
        //指定区域
        formart.locale = NSLocale(localeIdentifier: "en")
        
         //把现在的时间格式改为与数据库一致
        formart.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
        //取得现在的时间
        let dateStr = formart.stringFromDate(date)
       
        print(date)
        //编写sql语句，判断数据库里的数据是否减去最大时间小，如果是删除
        let sql = "DELETE  FORM T_Status WHERE createTime < ?"
        
        SQLiteManager.sharedManager.queue.inDatabase { (db) -> Void in
            db.executeUpdate(sql, dateStr)
        }
    }
    
    //MARK: 总的加载数据
    class func loadStatus (since_id: Int, max_id: Int,finshed:(array: [[String : AnyObject]]?)->()){
        
        //检查有无缓存,如果没有进行网络下载
        let array = cheackCacheData(since_id, max_id: max_id)
        
        if array?.count > 0 {
            finshed(array: array!)
            return
        }
        
        //开始网路下载
        NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
            
            if error != nil {
                print("下载Status出错")
                print(error)
                return
            }
            
            //转化一下数据类型
            guard let arr = (result?["statuses"])! as? [[String : AnyObject]] else{
                return
            }
           
            //保存到本地
            saveCacheToBaseData(arr)
            
            //MARK:5.返回保存的网络数据
            finshed(array: arr)
       }
    }
    
    //MARK:1.检查数据库有无缓存
     private class func cheackCacheData (since_id: Int, max_id: Int)-> [[String : AnyObject]]?{
        
        //检查一下用户是否登录
        guard let userId = UserAccountViewModel.shareModel.account?.uid else
        {
            return nil
        }
        
        //检查一下登录的用户是否有存储数据
        var sql = "SELECT statusId, status, userId FROM T_Status \n"
        sql += "WHERE userId = \(userId)"
        
        if since_id > 0 {
            sql +=  " AND statusId > \(since_id)"
        }else if max_id > 0{
            sql +=  " AND statusId < \(max_id)"
        }else{
            return nil
        }
        
        sql += " ORDER BY statusId LIMIT 20;"
        //如果有从数据库里面取出数据
        let array = SQLiteManager.sharedManager.execRecordSet(sql)
        
        //创建可变数组接收，字典
        var arrM =  [[String : AnyObject]]()
        
        //对取出的数组进行反序列化
        for dic in array {
            let jsonData = dic["status"] as! NSData
            let result = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
            arrM.append(result as! [String : AnyObject])
        }
        print(arrM)
        return arrM
    }
    
    //MARK:4.保存网络下载数据到数据库
     private class func saveCacheToBaseData(array: [[String: AnyObject]]){
        
        guard let userID = UserAccountViewModel.shareModel.account?.uid else{
            print("用户没有登录")
            return
        }
        
        //发送sql请求到数据库，保存数据参数 userID statusId status
        /**
        1. 微博 id -> 通过字典获取
        2. 微博 json -> 字典序列化
        3. userId -> 登录的用户
        */
        let sql = "INSERT OR REPLACE INTO T_Status (statusId, status, userId) VALUES (?, ?, ?);"
        
        SQLiteManager.sharedManager.queue.inTransaction { (db, rollback) -> Void in
            
            for dict in array {
                
                //获取statusId
                let statusId = dict["id"] as! Int
                
                //获取json文件
                let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
                
                //写入到数据库
               if !db.executeUpdate(sql,statusId,json,userID) {
                    //如果写入失败执行回滚
                    print("写入失败")
                    rollback.memory = true
                    break
                }
            }
        }
    }
}